package com.threadmethod.safe;

import java.util.Random;

/**
 * @PackageName:com.threadmethod.safe
 * @ClassName:Test
 * @Description: 测试线程的可见性
 * @Author: zhangxiaoyu
 * @date 2020/11/24 16:08
 */
public class Test {

    public static void main(String[] args) throws InterruptedException {

        //创建线程
        MyTask task = new MyTask();
        new Thread(task).start();

        Thread.sleep(1000);

        //主线程1秒之后取消子线程
        task.cancel();


        //可能会出现在main线程中，调用了cancel（），把task对象的变量改为true，可能子线程看步到main线程对变量的修改，在子线程中一直为false
        //导致子线程看不到main线程对变量更新的原因可能

    }

    static  class MyTask  implements  Runnable{

        private  boolean toCancel = false;

        @Override
        public void run() {

            while (!toCancel){
                
                if(doSomething()){
                    
                    //break;
                }
                
             if(toCancel){
                 System.out.println("任务被取消");
             }else{
                 System.out.println("任务正常结束");
             }
            }
        }
        
        private boolean doSomething(){
            System.out.println("执行某个任务-----------");

            try {
                //模拟执行任务的时间
                Thread.sleep(new Random().nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return true;
        }
        
        public void cancel(){
            toCancel = true;
            System.out.println("收到线程取消的消息");
        }
        
    }
}
